package com.imut.lagain.repository;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.imut.lagain.entity.MemoryCapsule;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 记忆胶囊数据访问层
 */
@Mapper
public interface MemoryCapsuleRepository extends BaseMapper<MemoryCapsule> {
    
    /**
     * 根据用户ID查询胶囊列表
     * @param userId 用户ID
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    @Select("SELECT * FROM memory_capsule WHERE user_id = #{userId} AND is_deleted = 0 ORDER BY create_time DESC")
    IPage<MemoryCapsule> findByUserId(@Param("userId") Long userId, Page<MemoryCapsule> page);
    
    /**
     * 根据分享码查询胶囊
     * @param shareCode 分享码
     * @return 胶囊信息
     */
    @Select("SELECT * FROM memory_capsule WHERE share_code = #{shareCode} AND is_deleted = 0")
    MemoryCapsule findByShareCode(@Param("shareCode") String shareCode);
    
    /**
     * 根据状态查询胶囊列表
     * @param status 胶囊状态
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    @Select("SELECT * FROM memory_capsule WHERE status = #{status} AND is_deleted = 0 ORDER BY create_time DESC")
    IPage<MemoryCapsule> findByStatus(@Param("status") Integer status, Page<MemoryCapsule> page);
    
    /**
     * 根据状态查询胶囊列表（字符串类型）
     * @param status 胶囊状态
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    @Select("SELECT * FROM memory_capsule WHERE status = #{status} AND is_deleted = 0 ORDER BY create_time DESC")
    IPage<MemoryCapsule> findByStatus(@Param("status") String status, Page<MemoryCapsule> page);
    
    /**
     * 根据类型查询胶囊列表
     * @param type 胶囊类型
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    @Select("SELECT * FROM memory_capsule WHERE type = #{type} AND is_deleted = 0 ORDER BY create_time DESC")
    IPage<MemoryCapsule> findByType(@Param("type") Integer type, Page<MemoryCapsule> page);
    
    /**
     * 根据类型查询胶囊列表（字符串类型）
     * @param type 胶囊类型
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    @Select("SELECT * FROM memory_capsule WHERE type = #{type} AND is_deleted = 0 ORDER BY create_time DESC")
    IPage<MemoryCapsule> findByType(@Param("type") String type, Page<MemoryCapsule> page);
    
    /**
     * 查询用户指定状态的胶囊
     * @param userId 用户ID
     * @param status 胶囊状态
     * @return 胶囊列表
     */
    @Select("SELECT * FROM memory_capsule WHERE user_id = #{userId} AND status = #{status} AND is_deleted = 0 ORDER BY create_time DESC")
    List<MemoryCapsule> findByUserIdAndStatus(@Param("userId") Long userId, @Param("status") Integer status);
    
    /**
     * 查询即将开启的胶囊（开启时间在指定时间之前）
     * @param openTime 开启时间
     * @return 胶囊列表
     */
    @Select("SELECT * FROM memory_capsule WHERE open_time <= #{openTime} AND status = 2 AND is_deleted = 0")
    List<MemoryCapsule> findCapsulesReadyToOpen(@Param("openTime") LocalDateTime openTime);
    
    /**
     * 查询即将开启的胶囊（开启时间在指定时间之前）
     * @param beforeTime 时间范围
     * @return 胶囊列表
     */
    @Select("SELECT * FROM memory_capsule WHERE open_time <= #{beforeTime} AND status = 2 AND is_deleted = 0")
    List<MemoryCapsule> findCapsulesAboutToOpen(@Param("beforeTime") LocalDateTime beforeTime);
    
    /**
     * 根据标题模糊查询胶囊
     * @param title 标题关键字
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    @Select("SELECT * FROM memory_capsule WHERE title LIKE CONCAT('%', #{title}, '%') AND is_deleted = 0 ORDER BY create_time DESC")
    IPage<MemoryCapsule> findByTitleLike(@Param("title") String title, Page<MemoryCapsule> page);
    
    /**
     * 用户根据标题模糊查询自己的胶囊
     * @param userId 用户ID
     * @param title 标题关键字
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    @Select("SELECT * FROM memory_capsule WHERE user_id = #{userId} AND title LIKE CONCAT('%', #{title}, '%') AND is_deleted = 0 ORDER BY create_time DESC")
    IPage<MemoryCapsule> findByUserIdAndTitleLike(@Param("userId") Long userId, @Param("title") String title, Page<MemoryCapsule> page);
    
    /**
     * 统计用户胶囊数量
     * @param userId 用户ID
     * @return 胶囊数量
     */
    @Select("SELECT COUNT(*) FROM memory_capsule WHERE user_id = #{userId} AND is_deleted = 0")
    Long countByUserId(@Param("userId") Long userId);
    
    /**
     * 统计指定状态的胶囊数量
     * @param status 胶囊状态
     * @return 胶囊数量
     */
    @Select("SELECT COUNT(*) FROM memory_capsule WHERE status = #{status} AND is_deleted = 0")
    Long countByStatus(@Param("status") Integer status);
    
    /**
     * 统计用户指定状态的胶囊数量
     * @param userId 用户ID
     * @param status 胶囊状态
     * @return 胶囊数量
     */
    @Select("SELECT COUNT(*) FROM memory_capsule WHERE user_id = #{userId} AND status = #{status} AND is_deleted = 0")
    Long countByUserIdAndStatus(@Param("userId") Long userId, @Param("status") Integer status);
    
    /**
     * 更新胶囊状态
     * @param capsuleId 胶囊ID
     * @param status 新状态
     * @return 影响行数
     */
    @Update("UPDATE memory_capsule SET status = #{status}, update_time = NOW() WHERE id = #{capsuleId}")
    int updateStatus(@Param("capsuleId") Long capsuleId, @Param("status") Integer status);
    
    /**
     * 更新胶囊封存时间
     * @param capsuleId 胶囊ID
     * @param sealedTime 封存时间
     * @return 影响行数
     */
    @Update("UPDATE memory_capsule SET sealed_time = #{sealedTime}, status = 2, update_time = NOW() WHERE id = #{capsuleId}")
    int updateSealedTime(@Param("capsuleId") Long capsuleId, @Param("sealedTime") LocalDateTime sealedTime);
    
    /**
     * 检查分享码是否存在
     * @param shareCode 分享码
     * @return 是否存在
     */
    @Select("SELECT COUNT(*) > 0 FROM memory_capsule WHERE share_code = #{shareCode} AND is_deleted = 0")
    boolean existsByShareCode(@Param("shareCode") String shareCode);
    
    /**
     * 统计胶囊数量
     * @param userId 用户ID（null表示所有用户）
     * @param status 状态（null表示所有状态）
     * @param type 类型（null表示所有类型）
     * @return 胶囊数量
     */
    /*
    @Select("<script>" +
            "SELECT COUNT(*) FROM memory_capsule WHERE is_deleted = 0" +
            "<if test='userId != null'> AND user_id = #{userId}</if>" +
            "<if test='status != null'> AND status = #{status}</if>" +
            "<if test='type != null'> AND type = #{type}</if>" +
            "</script>")
    Long countCapsules(@Param("userId") Long userId, @Param("status") String status, @Param("type") String type);
    */
    
    /**
     * 查询指定时间范围内创建的胶囊
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 胶囊列表
     */
    @Select("SELECT * FROM memory_capsule WHERE create_time BETWEEN #{startTime} AND #{endTime} AND is_deleted = 0 ORDER BY create_time DESC")
    List<MemoryCapsule> findByCreateTimeBetween(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}
